package test;

public class BiShi {
    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        int n = scanner.nextInt();
//        int[] num = new int[n];
//        // 输入数据存入数组
//        for (int i = 0; i < n; i++) {
//            num[i] = scanner.nextInt();
//        }
        int[] num = {1,2,3,5,6};
        System.out.println(randomGet(num));
    }

    private static int randomGet(int[] num) {
        int sum = (1 + num.length)*num.length/2;
        double[] p = new double[num.length];
        // 按权重计算每一个元素出现的概率
        for (int i = 0; i < p.length; i++) {
            p[i] = (double) (i + 1) / sum;
        }
        double[] pSum = new double[p.length];
        pSum[0] = p[0];
        // 将概率累计求和，得到累计概率数组 pSum
        for (int i = 1; i < pSum.length; i++) {
            pSum[i] = pSum[i - 1] + p[i];
        }
        // 产生[0,1)的随机数
        double random = Math.random();
        if (random < pSum[0]){
            return num[0];
        }
        // 遍历累计概率数组，如果随机数 小于pSum[i]且大于等于pSum[i - 1]，则输出第i个数
        for (int i = 1; i < pSum.length; i++) {
            if (random < pSum[i] && random >= pSum[i - 1]){
                return num[i];
            }
        }
        // 否则返回
        return -1;
    }

    /**
     * 1. 输入数据存入数组
     * 2. 按权重计算每一个元素出现的概率
     * 3. 将概率累计求和，得到累计概率数组 pSum
     * 4. 产生[0,1)的随机数
     * 5. 遍历累计概率数组，如果随机数 小于pSum[i]且大于等于pSum[i - 1]，则输出第i个数
     */

}
